package com.boot.springBoot.encrypt;


import java.io.UnsupportedEncodingException;
import java.util.Base64;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Base64 算是编码吧  不能说是加密工具   任何语言的都差不多  网上也能解码的  编码组成
 *  a-z A-Z 0-9  + - =
 * 
 * （一）简单的java加密算法有：
 *  1.BASE64 严格地说，属于编码格式，而非加密算法
	2.MD5(Message Digest algorithm 5，信息摘要算法)
	3.SHA(Secure Hash Algorithm，安全散列算法)
	4.HMAC(Hash Message Authentication Code，散列消息鉴别码)
 * 
 * （二）对称算法和不对称算法
	1. 对称加密（Symmetric Cryptography）
		       对称加密是最快速、最简单的一种加密方式，加密（encryption）与解密（decryption）用的是同样的密钥（secret key）,这种方法在密码学中叫做对称加密算法。
 			   对称加密有很多种算法，由于它效率很高，所以被广泛使用在很多加密协议的核心当中。
		       对称加密解密时间都是非常快的。 
    2.非对称加密（Asymmetric Cryptography） 
		       非对称加密为数据的加密与解密提供了一个非常安全的方法，它使用了一对密钥，公钥（public key）和私钥（private key）。私钥只能由一方安全保管，不能外泄，
 				而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个（公钥）进行加密，而解密则需要另一个（私钥）密钥。
		       非对称解密是非常慢的，很简单的数据可能都要几个小时！

	3.常见的对称加密和非对称加密算法
		（1）对称加密算法：
		       在对称加密算法中常用的算法有：DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等。
		
		       DES（Data Encryption Standard）：数据加密标准，速度较快，适用于加密大量数据的场合。 
		       3DES（Triple DES）：是基于DES，对一块数据用三个不同的密钥进行三次加密，强度更高。 
		       AES（Advanced Encryption Standard）：高级加密标准，是下一代的加密算法标准，速度快，安全级别高；
		
		（2）非对称常用算法
		       RSA、Elgamal、背包算法、Rabin、D-H、ECC（椭圆曲线加密算法）。

	（三）其他
       Base64还不算加密算法，其实就是一种编码转换； 
       MD5、SHA是非对称加密算法
 * @author Administrator
 *
 */
public class Base64Util {
	
	/**
	 * org.apache.commons.codec.binary.Base64
	 */
	private static org.apache.commons.codec.binary.Base64 bc = new org.apache.commons.codec.binary.Base64();
	
	private static org.apache.tomcat.util.codec.binary.Base64 tbc = new org.apache.tomcat.util.codec.binary.Base64();
	
	private static Base64.Decoder sunDecoder = Base64.getDecoder();
	
	private static Base64.Encoder sunEncoder = Base64.getEncoder();
	
	private static final String  charset = "UTF-8";
	
	private static Logger logger = LoggerFactory.getLogger(Base64Util.class);
	
	private static final String  str = "Base64Util - str-我BASE64加密之后变成啥了";
	
	
	
	/**
	 * bc 解码
	 * @param str
	 * @return
	 */
	public static String bcDecoder(String str) {
		if(StringUtils.isBlank(str)){
			return null;
		}
		try {
			byte[] byt = str.getBytes(charset);
			
			return new String(bc.decode(byt));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	
	/**
	 * bc 解码
	 * @param str
	 * @return
	 */
	public static String bcEncoder(String str) {
		if(StringUtils.isBlank(str)){
			return null;
		}
		try {
			byte[] byt = str.getBytes(charset);
			
			return new String(bc.encode(byt));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public static String tbcDecoder(String arg) {
		if(StringUtils.isBlank(arg)){
			return null;
		}
		
		try {
			return new String(tbc.decode(arg.getBytes(charset)));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
	public static String tbcEncoder(String arg) {
		if(StringUtils.isBlank(arg)){
			return null;
		}
		
		try {
			return new String(tbc.encodeToString(arg.getBytes(charset)));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		System.out.println(str);
//		String paw  = bcEncoder(str);
//		System.out.println("bc加密后： "+paw);
//		System.out.println("bc解密后： "+bcDecoder(paw));
//		
//		String tpaw  = tbcEncoder(str);
//		logger.info("str=={}",str);
//		System.out.println("tbc加密后： "+tpaw);
//		System.out.println("tbc解密后： "+tbcDecoder(tpaw));
//		logger.info("tbc加密:{}",tpaw);
//		logger.info("bc加密:{}",paw);
//		Integer i = 1200;
//		Integer j = 1200;
//		System.out.println("j="+j.hashCode()+",i="+i.hashCode()+","+i.equals(j));
//		System.out.println(i==j);
//		System.out.println(str.hashCode());
//		
//		StringBuffer buf =new StringBuffer();
//		StringBuilder bud = new StringBuilder();
//		buf.append(i+",");
//		buf.append(j);
//		System.out.println(buf);
		

		
	}

}
